確認したレベルでは「各セクション毎にマージされる」です。
調べる
例えばモノレポなどでルート.eslintrc
を1つ置き、各ワークスペースにも.eslintrc
を置いているとします。
# tree
.
├── ...
├── .eslintrc
└── packages
└── foo
├── ...
└── .eslintrc
ルートの設定
ルートの設定は適当にこんな感じにしました。
{
"root": true,
"env": {
"browser": false,
"node": false
},
"rules": {
"no-unused-vars": 0,
"eqeqeq": 0
}
}
ワークスペースの設定
上記でのpackages/foo/.eslintrc
をこのようにしました。
{
"env": {
"node": true
},
"rules": {
"no-unused-vars": 2
}
}
さて、ここでpackages/foo
以下のファイルへの設定は考えられるもので、
マージされる(完全に置き換わる)
各セクションレベルでマージされる(ディープマージ)
どれが正解なのかという疑問がでてきました。
調べる
対象のファイルへ適用される設定を調べるには--print-config
オプションが使えます。
ルートで、
eslint --print-config packages/foo/foo.js
結果はこうでした。(env
とrules
以外のセクションは削除してます)
{
"env": {
"browser": false,
"node": true
},
"rules": {
"no-unused-vars": 2,
"eqeqeq": 0
},
"root": true
}
完全に置き換えたい
そんな時は子.eslintrc
にroot:true
を追加します。実は ESLint はルート設定まで遡り設定をディープマージしていくような動作をします。これがroot:true
により「自分自身ファイルがルートです」となることでで親設定を拾わず、それだけの設定にすることができます。
{
"root": true,
"env": {
"node": true
},
"rules": {
"no-unused-vars": 2
}
}
結果。
{
"env": {
"node": true
},
"rules": {
"no-unused-vars": 2
},
"root": true
}